package com.bpm.example.event.time;

import com.bpm.common.util.FlowableEngineUtil;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.junit.Test;

/**
 * 运行定时中间捕获事件流程：
 *
 * 定时器中间捕获事件指在流程中将一个定时器作为独立的节点来运行，是一个捕获事件。
 * 当流程流转到定时器中间捕获事件时，会启动一个定时器，并一直等待触发，只有到达指定时间定时器才被触发
 */
@Slf4j
public class RunTimerIntermediateCatchingEventProcessDemo extends FlowableEngineUtil {
    @Test
    public void runTimerIntermediateCatchingEventProcessDemo() throws Exception {
        //加载Flowable配置文件并初始化流程引擎及服务
        initFlowableEngineAndServices("flowable.job.xml");
        //部署流程（当流转到定时器中间捕获事件，启动一个定时器到达指定时间触发）
        deployResource("processes/TimerIntermediateCatchingEventProcess.bpmn20.xml");

        //启动流程
        ProcessInstance procInst = runtimeService
                .startProcessInstanceByKey("timerIntermediateCatchingEventProcess");
        TaskQuery taskQuery = taskService.createTaskQuery()
                .processInstanceId(procInst.getId());
        //查询第一个任务
        Task firstTask = taskQuery.singleResult();
        log.info("第一个任务为：{}", firstTask.getName());
        //完成第一个任务
        taskService.complete(firstTask.getId());

        //立马获取下一个任务
        Task task = taskQuery.singleResult();
        assert task == null;

        //暂停20s
        log.info("暂停20s");
        Thread.sleep(1000 * 20);
        //查询第二个任务节点
        Task secondTask = taskQuery.singleResult();
        log.info("第二个任务为：{}", secondTask.getName());
    }
}
